package com.xbai.config;


import com.xbai.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @author jxbai
 * @desc
 * 自动装配：
 *  Spring 利用依赖注入（DI），完成对 IOC 容器中各个组件的依赖关系赋值
 *
 * 1）、@Autowired：自动注入，spring 定义的
 *      1）、按照类型去容器中找对应的组件；applicationContext.getBean(BookDao.class)
 *      2)、Spring 5 如果容器中有多个，会报错 .NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xbai.dao.BookDao' available: expected single matching bean but found 2
 *      3）、Spring 4 如果找到多个相同类型的罪案，再讲属性的名称作为组件的id去中期中查找，也可以使用 @Qualifier 指定需要装配的组件的id，而不是使用属性名
 *      4）、自动装配默认一定要将属性赋值好，没有就会报错 UnsatisfiedDependencyException: Error creating bean with name 'bookService': Unsatisfied dependency expressed through field 'bookDao'，
 *          可以使用@Autowired(required=false)调整为非必须的
 *      5）、@Primary：让 Spring 进行自动装配的时候，默认使用首选的 bean
 *
 * 2）、Spring还支持使用@Resource(JSR250)和@Inject(JSR330)【Java规范的注解】
 *      @Resource：可以和 @Autowired 一样实现自动装配功能，默认是按照组件名称进行装配的；
 *          没有能支持 Primary功能，没有支持 @Autowired(required=false)
 *       @Inject：使用前需要导入javax.inject的包，和 @Autowired 的功能一样，没有required=false功能
 *
 *       AutowiredAnnotationBeanPostProcessor：解析完成自动装配功能
 * @date 2021/4/25
 */
@Configuration
@ComponentScan({"com.xbai.service", "com.xbai.dao", "com.xbai.bean"})
public class MainConfigOfAutowired {

    @Bean("bookDao2")
    @Primary
    public BookDao bookDao() {
        return new BookDao();
    }
}
